{
 "cells": [
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tutorial Author:Mohammadreza Tavasoli Naeini Advisor:Hanrui Wang"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This tutorial shows; how to use the TrochQuantum library in building a quantum transformer.\n",
    "This notebook is adapted, excerpted from https://github.com/rdisipio/qlstm, written by Riccardo Di Sipio. \n",
    "In this notebook, we use the TorchQuantum library instead of the Pennylane library to build a quantum machine learning model."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build and train a Quantum LSTM."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Installation"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "fatal: destination path 'torchquantum' already exists and is not an empty directory.\r\n"
     ]
    }
   ],
   "source": [
    "!git clone https://github.com/mit-han-lab/torchquantum.git"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "/Users/mohammad/qlstm/torchquantum\n"
     ]
    }
   ],
   "source": [
    "%cd torchquantum"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Obtaining file:///Users/mohammad/qlstm/torchquantum\n",
      "Requirement already satisfied: numpy>=1.19.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (1.20.1)\n",
      "Requirement already satisfied: torchvision>=0.9.0.dev20210130 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (0.9.1)\n",
      "Requirement already satisfied: tqdm>=4.56.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (4.60.0)\n",
      "Requirement already satisfied: setuptools>=52.0.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (65.3.0)\n",
      "Requirement already satisfied: torch>=1.8.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (1.8.1)\n",
      "Requirement already satisfied: torchpack>=0.3.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (0.3.1)\n",
      "Requirement already satisfied: qiskit>=0.32.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (0.38.0)\n",
      "Requirement already satisfied: matplotlib>=3.3.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (3.4.1)\n",
      "Requirement already satisfied: pathos>=0.2.7 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (0.2.9)\n",
      "Requirement already satisfied: pylatexenc>=2.10 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchquantum==0.1.2) (2.10)\n",
      "Requirement already satisfied: cycler>=0.10 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from matplotlib>=3.3.2->torchquantum==0.1.2) (0.10.0)\n",
      "Requirement already satisfied: pillow>=6.2.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from matplotlib>=3.3.2->torchquantum==0.1.2) (8.2.0)\n",
      "Requirement already satisfied: kiwisolver>=1.0.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from matplotlib>=3.3.2->torchquantum==0.1.2) (1.3.1)\n",
      "Requirement already satisfied: pyparsing>=2.2.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from matplotlib>=3.3.2->torchquantum==0.1.2) (2.4.7)\n",
      "Requirement already satisfied: python-dateutil>=2.7 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from matplotlib>=3.3.2->torchquantum==0.1.2) (2.8.1)\n",
      "Requirement already satisfied: six in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from cycler>=0.10->matplotlib>=3.3.2->torchquantum==0.1.2) (1.15.0)\n",
      "Requirement already satisfied: dill>=0.3.5.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from pathos>=0.2.7->torchquantum==0.1.2) (0.3.5.1)\n",
      "Requirement already satisfied: multiprocess>=0.70.13 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from pathos>=0.2.7->torchquantum==0.1.2) (0.70.13)\n",
      "Requirement already satisfied: ppft>=1.7.6.5 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from pathos>=0.2.7->torchquantum==0.1.2) (1.7.6.5)\n",
      "Requirement already satisfied: pox>=0.3.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from pathos>=0.2.7->torchquantum==0.1.2) (0.3.1)\n",
      "Requirement already satisfied: qiskit-aer==0.11.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit>=0.32.0->torchquantum==0.1.2) (0.11.0)\n",
      "Requirement already satisfied: qiskit-ibmq-provider==0.19.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit>=0.32.0->torchquantum==0.1.2) (0.19.2)\n",
      "Requirement already satisfied: qiskit-terra==0.21.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit>=0.32.0->torchquantum==0.1.2) (0.21.2)\n",
      "Requirement already satisfied: scipy>=1.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-aer==0.11.0->qiskit>=0.32.0->torchquantum==0.1.2) (1.6.1)\n",
      "Requirement already satisfied: requests-ntlm>=1.1.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.1.0)\n",
      "Requirement already satisfied: urllib3>=1.21.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.26.4)\n",
      "Requirement already satisfied: websockets>=10.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (10.3)\n",
      "Requirement already satisfied: websocket-client>=1.0.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.4.1)\n",
      "Requirement already satisfied: requests>=2.19 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (2.25.1)\n",
      "Requirement already satisfied: ply>=3.10 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (3.11)\n",
      "Requirement already satisfied: retworkx>=0.11.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (0.11.0)\n",
      "Requirement already satisfied: stevedore>=3.0.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (4.0.0)\n",
      "Requirement already satisfied: psutil>=5 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (5.8.0)\n",
      "Requirement already satisfied: tweedledum<2.0,>=1.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.1.1)\n",
      "Requirement already satisfied: sympy>=1.3 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.7.1)\n",
      "Requirement already satisfied: symengine>=0.9 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (0.9.2)\n",
      "Requirement already satisfied: chardet<5,>=3.0.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from requests>=2.19->qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (4.0.0)\n",
      "Requirement already satisfied: idna<3,>=2.5 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from requests>=2.19->qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (2.10)\n",
      "Requirement already satisfied: certifi>=2017.4.17 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from requests>=2.19->qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (2020.12.5)\n",
      "Requirement already satisfied: ntlm-auth>=1.0.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from requests-ntlm>=1.1.0->qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.5.0)\n",
      "Requirement already satisfied: cryptography>=1.3 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from requests-ntlm>=1.1.0->qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (3.4.7)\n",
      "Requirement already satisfied: cffi>=1.12 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.14.5)\n",
      "Requirement already satisfied: pycparser in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from cffi>=1.12->cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibmq-provider==0.19.2->qiskit>=0.32.0->torchquantum==0.1.2) (2.20)\n",
      "Requirement already satisfied: pbr!=2.1.0,>=2.0.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from stevedore>=3.0.0->qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (5.10.0)\n",
      "Requirement already satisfied: mpmath>=0.19 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from sympy>=1.3->qiskit-terra==0.21.2->qiskit>=0.32.0->torchquantum==0.1.2) (1.2.1)\n",
      "Requirement already satisfied: typing-extensions in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torch>=1.8.0->torchquantum==0.1.2) (3.7.4.3)\n",
      "Requirement already satisfied: loguru in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchpack>=0.3.0->torchquantum==0.1.2) (0.6.0)\n",
      "Requirement already satisfied: multimethod in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchpack>=0.3.0->torchquantum==0.1.2) (1.8)\n",
      "Requirement already satisfied: pyyaml in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchpack>=0.3.0->torchquantum==0.1.2) (5.3.1)\n",
      "Requirement already satisfied: tensorboard in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchpack>=0.3.0->torchquantum==0.1.2) (2.9.1)\n",
      "Requirement already satisfied: tensorpack in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchpack>=0.3.0->torchquantum==0.1.2) (0.11)\n",
      "Requirement already satisfied: h5py in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchpack>=0.3.0->torchquantum==0.1.2) (3.1.0)\n",
      "Requirement already satisfied: toml in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from torchpack>=0.3.0->torchquantum==0.1.2) (0.10.2)\n",
      "Requirement already satisfied: protobuf<3.20,>=3.9.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (3.15.7)\n",
      "Requirement already satisfied: grpcio>=1.24.3 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (1.37.0)\n",
      "Requirement already satisfied: google-auth<3,>=1.6.3 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (1.28.0)\n",
      "Requirement already satisfied: tensorboard-data-server<0.7.0,>=0.6.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (0.6.1)\n",
      "Requirement already satisfied: wheel>=0.26 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (0.36.2)\n",
      "Requirement already satisfied: werkzeug>=1.0.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (1.0.1)\n",
      "Requirement already satisfied: google-auth-oauthlib<0.5,>=0.4.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (0.4.4)\n",
      "Requirement already satisfied: markdown>=2.6.8 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (3.3.4)\n",
      "Requirement already satisfied: tensorboard-plugin-wit>=1.6.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (1.8.0)\n",
      "Requirement already satisfied: absl-py>=0.4 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (1.2.0)\n",
      "Requirement already satisfied: pyasn1-modules>=0.2.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (0.2.8)\n",
      "Requirement already satisfied: rsa<5,>=3.1.4 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (4.7.2)\n",
      "Requirement already satisfied: cachetools<5.0,>=2.0.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from google-auth<3,>=1.6.3->tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (4.2.1)\n",
      "Requirement already satisfied: requests-oauthlib>=0.7.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from google-auth-oauthlib<0.5,>=0.4.1->tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (1.3.0)\n",
      "Requirement already satisfied: pyasn1<0.5.0,>=0.4.6 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from pyasn1-modules>=0.2.1->google-auth<3,>=1.6.3->tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (0.4.8)\n",
      "Requirement already satisfied: oauthlib>=3.0.0 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from requests-oauthlib>=0.7.0->google-auth-oauthlib<0.5,>=0.4.1->tensorboard->torchpack>=0.3.0->torchquantum==0.1.2) (3.1.0)\n",
      "Requirement already satisfied: msgpack>=0.5.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorpack->torchpack>=0.3.0->torchquantum==0.1.2) (1.0.4)\n",
      "Requirement already satisfied: msgpack-numpy>=0.4.4.2 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorpack->torchpack>=0.3.0->torchquantum==0.1.2) (0.4.8)\n",
      "Requirement already satisfied: tabulate>=0.7.7 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorpack->torchpack>=0.3.0->torchquantum==0.1.2) (0.8.10)\n",
      "Requirement already satisfied: pyzmq>=16 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorpack->torchpack>=0.3.0->torchquantum==0.1.2) (22.3.0)\n",
      "Requirement already satisfied: termcolor>=1.1 in /Users/mohammad/miniforge3/lib/python3.8/site-packages (from tensorpack->torchpack>=0.3.0->torchquantum==0.1.2) (1.1.0)\n",
      "Installing collected packages: torchquantum\n",
      "  Attempting uninstall: torchquantum\n",
      "    Found existing installation: torchquantum 0.1.2\n",
      "    Uninstalling torchquantum-0.1.2:\n",
      "      Successfully uninstalled torchquantum-0.1.2\n",
      "  Running setup.py develop for torchquantum\n",
      "Successfully installed torchquantum\n"
     ]
    }
   ],
   "source": [
    "!pip install --editable ."
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Setup"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Our code requires torchquantum lib,and pytorch. We need torch function from torch.nn.functional, optimizers(optim), torchquantum module.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "import torch.optim as optim\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import torchquantum as tq\n",
    "import torchquantum.functional as tqf"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Build Quantum LSTM "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Before the rise of the transformer, recurrent neural networks, especially Long Short-Term Memory (LSTM), were the most successful techniques for generating and analyzing sequential data. LSTM uses a combination of “memory” and “statefulness” tricks to understand which parts of the input are relevant to compute the output.[1]"
   ]
  },
  {
   "attachments": {
    "Screen%20Shot%202022-09-15%20at%2010.25.20%20PM-2.png": {
     "image/png": "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"
    }
   },
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![Screen%20Shot%202022-09-15%20at%2010.25.20%20PM-2.png](attachment:Screen%20Shot%202022-09-15%20at%2010.25.20%20PM-2.png)<figcaption align = \"center\"> LSTM architecture </figcaption>"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To convert classical LSTM to quantum-enhanced LSTM (QLSTM) each of the classical linear operations Wf, Wi, WC, and Wo is replaced by a hybrid quantum-classical component that consists of a Variational Quantum Circuit sandwiched between classical layers.\n",
    "[1]"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Typically a Quantum Neural Network module consists of three parts: encoder, ansatz, and measurement. We can create an encoder by passing a list of gates to tq.GeneralEncoder. Each entry in the list contains input_idx, func, and wires. Here, each qubit has a rotation-X gate. 4 RX gates in total. They can encode the 4 input data to the quantum state. Then we choose ansatz such that they are entangled between each other, rotated by an arbitrary angle. Finally, we perform Pauli-Z measurements on each qubit by creating a tq.MeasureAll module and passing tq.PauliZ to it. The measure function will return four expectation values from four qubits.\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class QLSTM(nn.Module):\n",
    "    # use 'qiskit.ibmq' instead to run on hardware\n",
    "    class QLayer_forget(tq.QuantumModule):\n",
    "        def __init__(self):\n",
    "            super().__init__()    \n",
    "            self.n_wires = 4\n",
    "            self.encoder = tq.GeneralEncoder(\n",
    "        [   {'input_idx': [0], 'func': 'rx', 'wires': [0]},\n",
    "            {'input_idx': [1], 'func': 'rx', 'wires': [1]},\n",
    "            {'input_idx': [2], 'func': 'rx', 'wires': [2]},\n",
    "            {'input_idx': [3], 'func': 'rx', 'wires': [3]},\n",
    "        ])\n",
    "            self.rx0 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx1 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx2 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx3 = tq.RX(has_params=True, trainable=True)\n",
    "            self.measure = tq.MeasureAll(tq.PauliZ)\n",
    "\n",
    "        def forward(self, x):\n",
    "            qdev = tq.QuantumDevice(n_wires=self.n_wires, bsz=x.shape[0], device=x.device)\n",
    "            self.encoder(qdev, x)\n",
    "            self.rx0(qdev, wires=0)\n",
    "            self.rx1(qdev, wires=1)\n",
    "            self.rx2(qdev, wires=2)\n",
    "            self.rx3(qdev, wires=3)\n",
    "            for k in range(self.n_wires):\n",
    "                if k==self.n_wires-1:\n",
    "                    tqf.cnot(qdev, wires=[k, 0]) \n",
    "                else:\n",
    "                    tqf.cnot(qdev, wires=[k, k+1])\n",
    "            return(self.measure(qdev))\n",
    "        \n",
    "    class QLayer_input(tq.QuantumModule):\n",
    "        def __init__(self):\n",
    "            super().__init__()    \n",
    "            self.n_wires = 4\n",
    "            self.encoder = tq.GeneralEncoder(\n",
    "        [   {'input_idx': [0], 'func': 'rx', 'wires': [0]},\n",
    "            {'input_idx': [1], 'func': 'rx', 'wires': [1]},\n",
    "            {'input_idx': [2], 'func': 'rx', 'wires': [2]},\n",
    "            {'input_idx': [3], 'func': 'rx', 'wires': [3]},\n",
    "        ])\n",
    "            self.rx0 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx1 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx2 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx3 = tq.RX(has_params=True, trainable=True)\n",
    "            self.measure = tq.MeasureAll(tq.PauliZ)\n",
    "\n",
    "        def forward(self, x):\n",
    "            qdev = tq.QuantumDevice(n_wires=self.n_wires, bsz=x.shape[0], device=x.device)\n",
    "            self.encoder(qdev, x)\n",
    "            self.rx0(qdev, wires=0)\n",
    "            self.rx1(qdev, wires=1)\n",
    "            self.rx2(qdev, wires=2)\n",
    "            self.rx3(qdev, wires=3)\n",
    "            for k in range(self.n_wires):\n",
    "                if k==self.n_wires-1:\n",
    "                    tqf.cnot(qdev, wires=[k, 0]) \n",
    "                else:\n",
    "                    tqf.cnot(qdev, wires=[k, k+1])\n",
    "            return(self.measure(qdev))\n",
    "        \n",
    "    class QLayer_update(tq.QuantumModule):\n",
    "        def __init__(self):\n",
    "            super().__init__()    \n",
    "            self.n_wires = 4\n",
    "            self.encoder = tq.GeneralEncoder(\n",
    "        [   {'input_idx': [0], 'func': 'rx', 'wires': [0]},\n",
    "            {'input_idx': [1], 'func': 'rx', 'wires': [1]},\n",
    "            {'input_idx': [2], 'func': 'rx', 'wires': [2]},\n",
    "            {'input_idx': [3], 'func': 'rx', 'wires': [3]},\n",
    "        ])\n",
    "            self.rx0 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx1 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx2 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx3 = tq.RX(has_params=True, trainable=True)\n",
    "            self.measure = tq.MeasureAll(tq.PauliZ)\n",
    "\n",
    "        def forward(self, x):\n",
    "            qdev = tq.QuantumDevice(n_wires=self.n_wires, bsz=x.shape[0], device=x.device)\n",
    "            self.encoder(qdev, x)\n",
    "            self.rx0(qdev, wires=0)\n",
    "            self.rx1(qdev, wires=1)\n",
    "            self.rx2(qdev, wires=2)\n",
    "            self.rx3(qdev, wires=3)\n",
    "            for k in range(self.n_wires):\n",
    "                if k==self.n_wires-1:\n",
    "                    tqf.cnot(qdev, wires=[k, 0]) \n",
    "                else:\n",
    "                    tqf.cnot(qdev, wires=[k, k+1])\n",
    "            return(self.measure(qdev))\n",
    "        \n",
    "    class QLayer_output(tq.QuantumModule):\n",
    "        def __init__(self):\n",
    "            super().__init__()    \n",
    "            self.n_wires = 4\n",
    "            self.encoder = tq.GeneralEncoder(\n",
    "        [   {'input_idx': [0], 'func': 'rx', 'wires': [0]},\n",
    "            {'input_idx': [1], 'func': 'rx', 'wires': [1]},\n",
    "            {'input_idx': [2], 'func': 'rx', 'wires': [2]},\n",
    "            {'input_idx': [3], 'func': 'rx', 'wires': [3]},\n",
    "        ])\n",
    "            self.rx0 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx1 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx2 = tq.RX(has_params=True, trainable=True)\n",
    "            self.rx3 = tq.RX(has_params=True, trainable=True)\n",
    "            self.measure = tq.MeasureAll(tq.PauliZ)\n",
    "\n",
    "        def forward(self, x):\n",
    "            qdev = tq.QuantumDevice(n_wires=self.n_wires, bsz=x.shape[0], device=x.device)\n",
    "            self.encoder(qdev, x)\n",
    "            self.rx0(qdev, wires=0)\n",
    "            self.rx1(qdev, wires=1)\n",
    "            self.rx2(qdev, wires=2)\n",
    "            self.rx3(qdev, wires=3)\n",
    "            for k in range(self.n_wires):\n",
    "                if k==self.n_wires-1:\n",
    "                    tqf.cnot(qdev, wires=[k, 0]) \n",
    "                else:\n",
    "                    tqf.cnot(qdev, wires=[k, k+1])\n",
    "            return(self.measure(qdev))\n",
    "        \n",
    "    def __init__(self, \n",
    "                input_size, \n",
    "                hidden_size, \n",
    "                n_qubits=4,\n",
    "                n_qlayers=1,\n",
    "                batch_first=True,\n",
    "                return_sequences=False, \n",
    "                return_state=False,\n",
    "                backend=\"default.qubit\"):\n",
    "        super(QLSTM, self).__init__()\n",
    "        self.n_inputs = input_size\n",
    "        self.hidden_size = hidden_size\n",
    "        self.concat_size = self.n_inputs + self.hidden_size\n",
    "        self.n_qubits = n_qubits\n",
    "        self.n_qlayers = n_qlayers\n",
    "        self.backend = backend  # \"default.qubit\", \"qiskit.basicaer\", \"qiskit.ibm\"\n",
    "\n",
    "        self.batch_first = batch_first\n",
    "        self.return_sequences = return_sequences\n",
    "        self.return_state = return_state\n",
    "\n",
    "        self.clayer_in = torch.nn.Linear(self.concat_size, n_qubits)\n",
    "        self.VQC = {\n",
    "            'forget':self.QLayer_forget(),\n",
    "            'input': self.QLayer_input(),\n",
    "            'update':self.QLayer_update(),\n",
    "            'output':self.QLayer_output()\n",
    "        }\n",
    "        self.clayer_out = torch.nn.Linear(self.n_qubits, self.hidden_size)\n",
    "        #self.clayer_out = [torch.nn.Linear(n_qubits, self.hidden_size) for _ in range(4)]\n",
    "\n",
    "    def forward(self, x, init_states=None):\n",
    "        '''\n",
    "        x.shape is (batch_size, seq_length, feature_size)\n",
    "        recurrent_activation -> sigmoid\n",
    "        activation -> tanh\n",
    "        '''\n",
    "        if self.batch_first is True:\n",
    "            batch_size, seq_length, features_size = x.size()\n",
    "        else:\n",
    "            seq_length, batch_size, features_size = x.size()\n",
    "\n",
    "        hidden_seq = []\n",
    "        if init_states is None:\n",
    "            h_t = torch.zeros(batch_size, self.hidden_size)  # hidden state (output)\n",
    "            c_t = torch.zeros(batch_size, self.hidden_size)  # cell state\n",
    "        else:\n",
    "            # for now we ignore the fact that in PyTorch you can stack multiple RNNs\n",
    "            # so we take only the first elements of the init_states tuple init_states[0][0], init_states[1][0]\n",
    "            h_t, c_t = init_states\n",
    "            h_t = h_t[0]\n",
    "            c_t = c_t[0]\n",
    "\n",
    "        for t in range(seq_length):\n",
    "            # get features from the t-th element in seq, for all entries in the batch\n",
    "            x_t = x[:, t, :]\n",
    "            \n",
    "            # Concatenate input and hidden state\n",
    "            v_t = torch.cat((h_t, x_t), dim=1)\n",
    "\n",
    "            # match qubit dimension\n",
    "            y_t = self.clayer_in(v_t)\n",
    "\n",
    "            f_t = torch.sigmoid(self.clayer_out(self.VQC['forget'](y_t)))  # forget block\n",
    "            i_t = torch.sigmoid(self.clayer_out(self.VQC['input'](y_t)))  # input block\n",
    "            g_t = torch.tanh(self.clayer_out(self.VQC['update'](y_t)))  # update block\n",
    "            o_t = torch.sigmoid(self.clayer_out(self.VQC['output'](y_t))) # output block\n",
    "\n",
    "            c_t = (f_t * c_t) + (i_t * g_t)\n",
    "            h_t = o_t * torch.tanh(c_t)\n",
    "\n",
    "            hidden_seq.append(h_t.unsqueeze(0))\n",
    "        hidden_seq = torch.cat(hidden_seq, dim=0)\n",
    "        hidden_seq = hidden_seq.transpose(0, 1).contiguous()\n",
    "        return hidden_seq, (h_t, c_t)\n",
    "\n"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## POS_tagging"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Here we define the possible tags: determinant, noun, verb."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "tag_to_ix = {\"DET\": 0, \"NN\": 1, \"V\": 2}  # Assign each tag with a unique index\n",
    "ix_to_tag = {i:k for k,i in tag_to_ix.items()}"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The function below tokenizes the sentence and matches the label to each word."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def prepare_sequence(seq, to_ix):\n",
    "    idxs = [to_ix[w] for w in seq]\n",
    "    return torch.tensor(idxs, dtype=torch.long)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we can prepare the input dataset."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Vocabulary: {'The': 0, 'dog': 1, 'ate': 2, 'the': 3, 'apple': 4, 'Everybody': 5, 'read': 6, 'that': 7, 'book': 8}\n",
      "Entities: {0: 'DET', 1: 'NN', 2: 'V'}\n"
     ]
    }
   ],
   "source": [
    "training_data = [\n",
    "    # Tags are: DET - determiner; NN - noun; V - verb\n",
    "    # For example, the word \"The\" is a determiner\n",
    "    (\"The dog ate the apple\".split(), [\"DET\", \"NN\", \"V\", \"DET\", \"NN\"]),\n",
    "    (\"Everybody read that book\".split(), [\"NN\", \"V\", \"DET\", \"NN\"])\n",
    "]\n",
    "word_to_ix = {}\n",
    "\n",
    "# For each words-list (sentence) and tags-list in each tuple of training_data\n",
    "for sent, tags in training_data:\n",
    "    for word in sent:\n",
    "        if word not in word_to_ix:  # word has not been assigned an index yet\n",
    "            word_to_ix[word] = len(word_to_ix)  # Assign each word with a unique index\n",
    "\n",
    "print(f\"Vocabulary: {word_to_ix}\")\n",
    "print(f\"Entities: {ix_to_tag}\")"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The idea is to pass the two sequences through the LSTM, which will output the hidden array of vectors [h_0, h_1, h_2, h_3, h_4], one for each word. A dense layer “head” is attached to the LSTM’s outputs to calculate the probability that each word may be a determinant, noun or verb."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class LSTMTagger(nn.Module):\n",
    "\n",
    "    def __init__(self, embedding_dim, hidden_dim, vocab_size, tagset_size, n_qubits=0):\n",
    "        super(LSTMTagger, self).__init__()\n",
    "        self.hidden_dim = hidden_dim\n",
    "\n",
    "        self.word_embeddings = nn.Embedding(vocab_size, embedding_dim)\n",
    "\n",
    "        # The LSTM takes word embeddings as inputs, and outputs hidden states\n",
    "        # with dimensionality hidden_dim.\n",
    "        if n_qubits > 0:\n",
    "            print(\"Tagger will use Quantum LSTM\")\n",
    "            self.lstm = QLSTM(embedding_dim, hidden_dim, n_qubits=n_qubits)\n",
    "        else:\n",
    "            print(\"Tagger will use Classical LSTM\")\n",
    "            self.lstm = nn.LSTM(embedding_dim, hidden_dim)\n",
    "\n",
    "        # The linear layer that maps from hidden state space to tag space\n",
    "        self.hidden2tag = nn.Linear(hidden_dim, tagset_size)\n",
    "\n",
    "    def forward(self, sentence):\n",
    "        embeds = self.word_embeddings(sentence)\n",
    "        lstm_out, _ = self.lstm(embeds.view(len(sentence), 1, -1))\n",
    "        tag_logits = self.hidden2tag(lstm_out.view(len(sentence), -1))\n",
    "        tag_scores = F.log_softmax(tag_logits, dim=1)\n",
    "        return tag_scores"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "embedding_dim = 8\n",
    "hidden_dim = 6\n",
    "n_epochs = 300"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tagger will use Classical LSTM\n"
     ]
    }
   ],
   "source": [
    "model_classical = LSTMTagger(embedding_dim, \n",
    "                        hidden_dim, \n",
    "                        vocab_size=len(word_to_ix), \n",
    "                        tagset_size=len(tag_to_ix), \n",
    "                        n_qubits=0)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Training"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Following the example from the PyTorch website, we train the two networks (classical and quantum LSTM) for 300 epochs. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "def train(model, n_epochs, training_data, word_to_ix, tag_to_ix):\n",
    "    loss_function = nn.NLLLoss()\n",
    "    optimizer = optim.SGD(model.parameters(), lr=0.1)\n",
    "\n",
    "    history = {\n",
    "        'loss': [],\n",
    "        'acc': []\n",
    "    }\n",
    "    for epoch in range(n_epochs):\n",
    "        losses = []\n",
    "        preds = []\n",
    "        targets = []\n",
    "        for sentence, tags in training_data:\n",
    "            # Step 1. Remember that Pytorch accumulates gradients.\n",
    "            # We need to clear them out before each instance\n",
    "            model.zero_grad()\n",
    "\n",
    "            # Step 2. Get our inputs ready for the network, that is, turn them into\n",
    "            # Tensors of word indices.\n",
    "            sentence_in = prepare_sequence(sentence, word_to_ix)\n",
    "            labels = prepare_sequence(tags, tag_to_ix)\n",
    "\n",
    "            # Step 3. Run our forward pass.\n",
    "            tag_scores = model(sentence_in)\n",
    "\n",
    "            # Step 4. Compute the loss, gradients, and update the parameters by\n",
    "            #  calling optimizer.step()\n",
    "            loss = loss_function(tag_scores, labels)\n",
    "            loss.backward()\n",
    "            optimizer.step()\n",
    "            losses.append(float(loss))\n",
    "            \n",
    "            probs = torch.softmax(tag_scores, dim=-1)\n",
    "            preds.append(probs.argmax(dim=-1))\n",
    "            targets.append(labels)\n",
    "\n",
    "        avg_loss = np.mean(losses)\n",
    "        history['loss'].append(avg_loss)\n",
    "        \n",
    "        preds = torch.cat(preds)\n",
    "        targets = torch.cat(targets)\n",
    "        corrects = (preds == targets)\n",
    "        accuracy = corrects.sum().float() / float(targets.size(0) )\n",
    "        history['acc'].append(accuracy)\n",
    "\n",
    "        print(f\"Epoch {epoch+1} / {n_epochs}: Loss = {avg_loss:.3f} Acc = {accuracy:.2f}\")\n",
    "\n",
    "    return history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1 / 300: Loss = 1.116 Acc = 0.22\n",
      "Epoch 2 / 300: Loss = 1.102 Acc = 0.22\n",
      "Epoch 3 / 300: Loss = 1.089 Acc = 0.56\n",
      "Epoch 4 / 300: Loss = 1.078 Acc = 0.67\n",
      "Epoch 5 / 300: Loss = 1.068 Acc = 0.56\n",
      "Epoch 6 / 300: Loss = 1.058 Acc = 0.67\n",
      "Epoch 7 / 300: Loss = 1.049 Acc = 0.56\n",
      "Epoch 8 / 300: Loss = 1.041 Acc = 0.67\n",
      "Epoch 9 / 300: Loss = 1.034 Acc = 0.67\n",
      "Epoch 10 / 300: Loss = 1.027 Acc = 0.67\n",
      "Epoch 11 / 300: Loss = 1.020 Acc = 0.67\n",
      "Epoch 12 / 300: Loss = 1.013 Acc = 0.67\n",
      "Epoch 13 / 300: Loss = 1.007 Acc = 0.56\n",
      "Epoch 14 / 300: Loss = 1.001 Acc = 0.56\n",
      "Epoch 15 / 300: Loss = 0.995 Acc = 0.44\n",
      "Epoch 16 / 300: Loss = 0.989 Acc = 0.44\n",
      "Epoch 17 / 300: Loss = 0.984 Acc = 0.44\n",
      "Epoch 18 / 300: Loss = 0.978 Acc = 0.56\n",
      "Epoch 19 / 300: Loss = 0.973 Acc = 0.56\n",
      "Epoch 20 / 300: Loss = 0.967 Acc = 0.56\n",
      "Epoch 21 / 300: Loss = 0.961 Acc = 0.56\n",
      "Epoch 22 / 300: Loss = 0.956 Acc = 0.56\n",
      "Epoch 23 / 300: Loss = 0.950 Acc = 0.56\n",
      "Epoch 24 / 300: Loss = 0.944 Acc = 0.67\n",
      "Epoch 25 / 300: Loss = 0.939 Acc = 0.67\n",
      "Epoch 26 / 300: Loss = 0.933 Acc = 0.67\n",
      "Epoch 27 / 300: Loss = 0.927 Acc = 0.78\n",
      "Epoch 28 / 300: Loss = 0.921 Acc = 0.78\n",
      "Epoch 29 / 300: Loss = 0.914 Acc = 0.78\n",
      "Epoch 30 / 300: Loss = 0.908 Acc = 0.78\n",
      "Epoch 31 / 300: Loss = 0.902 Acc = 0.78\n",
      "Epoch 32 / 300: Loss = 0.895 Acc = 0.78\n",
      "Epoch 33 / 300: Loss = 0.888 Acc = 0.78\n",
      "Epoch 34 / 300: Loss = 0.881 Acc = 0.78\n",
      "Epoch 35 / 300: Loss = 0.874 Acc = 0.78\n",
      "Epoch 36 / 300: Loss = 0.867 Acc = 0.78\n",
      "Epoch 37 / 300: Loss = 0.860 Acc = 0.78\n",
      "Epoch 38 / 300: Loss = 0.853 Acc = 0.78\n",
      "Epoch 39 / 300: Loss = 0.845 Acc = 0.78\n",
      "Epoch 40 / 300: Loss = 0.837 Acc = 0.78\n",
      "Epoch 41 / 300: Loss = 0.829 Acc = 0.78\n",
      "Epoch 42 / 300: Loss = 0.821 Acc = 0.78\n",
      "Epoch 43 / 300: Loss = 0.813 Acc = 0.78\n",
      "Epoch 44 / 300: Loss = 0.805 Acc = 0.78\n",
      "Epoch 45 / 300: Loss = 0.796 Acc = 0.78\n",
      "Epoch 46 / 300: Loss = 0.788 Acc = 0.78\n",
      "Epoch 47 / 300: Loss = 0.779 Acc = 0.78\n",
      "Epoch 48 / 300: Loss = 0.770 Acc = 0.78\n",
      "Epoch 49 / 300: Loss = 0.762 Acc = 0.78\n",
      "Epoch 50 / 300: Loss = 0.753 Acc = 0.78\n",
      "Epoch 51 / 300: Loss = 0.744 Acc = 0.78\n",
      "Epoch 52 / 300: Loss = 0.735 Acc = 0.78\n",
      "Epoch 53 / 300: Loss = 0.725 Acc = 0.78\n",
      "Epoch 54 / 300: Loss = 0.716 Acc = 0.78\n",
      "Epoch 55 / 300: Loss = 0.707 Acc = 0.78\n",
      "Epoch 56 / 300: Loss = 0.698 Acc = 0.78\n",
      "Epoch 57 / 300: Loss = 0.689 Acc = 0.78\n",
      "Epoch 58 / 300: Loss = 0.680 Acc = 0.78\n",
      "Epoch 59 / 300: Loss = 0.670 Acc = 0.78\n",
      "Epoch 60 / 300: Loss = 0.661 Acc = 0.78\n",
      "Epoch 61 / 300: Loss = 0.652 Acc = 0.78\n",
      "Epoch 62 / 300: Loss = 0.643 Acc = 0.78\n",
      "Epoch 63 / 300: Loss = 0.634 Acc = 0.78\n",
      "Epoch 64 / 300: Loss = 0.625 Acc = 0.78\n",
      "Epoch 65 / 300: Loss = 0.616 Acc = 0.78\n",
      "Epoch 66 / 300: Loss = 0.607 Acc = 0.78\n",
      "Epoch 67 / 300: Loss = 0.599 Acc = 0.78\n",
      "Epoch 68 / 300: Loss = 0.590 Acc = 0.78\n",
      "Epoch 69 / 300: Loss = 0.581 Acc = 0.78\n",
      "Epoch 70 / 300: Loss = 0.573 Acc = 0.78\n",
      "Epoch 71 / 300: Loss = 0.564 Acc = 0.78\n",
      "Epoch 72 / 300: Loss = 0.556 Acc = 0.78\n",
      "Epoch 73 / 300: Loss = 0.548 Acc = 0.78\n",
      "Epoch 74 / 300: Loss = 0.539 Acc = 0.78\n",
      "Epoch 75 / 300: Loss = 0.531 Acc = 0.78\n",
      "Epoch 76 / 300: Loss = 0.523 Acc = 0.78\n",
      "Epoch 77 / 300: Loss = 0.515 Acc = 0.78\n",
      "Epoch 78 / 300: Loss = 0.507 Acc = 0.78\n",
      "Epoch 79 / 300: Loss = 0.499 Acc = 0.78\n",
      "Epoch 80 / 300: Loss = 0.491 Acc = 0.89\n",
      "Epoch 81 / 300: Loss = 0.483 Acc = 0.89\n",
      "Epoch 82 / 300: Loss = 0.476 Acc = 0.89\n",
      "Epoch 83 / 300: Loss = 0.468 Acc = 1.00\n",
      "Epoch 84 / 300: Loss = 0.460 Acc = 1.00\n",
      "Epoch 85 / 300: Loss = 0.453 Acc = 1.00\n",
      "Epoch 86 / 300: Loss = 0.445 Acc = 1.00\n",
      "Epoch 87 / 300: Loss = 0.438 Acc = 1.00\n",
      "Epoch 88 / 300: Loss = 0.430 Acc = 1.00\n",
      "Epoch 89 / 300: Loss = 0.423 Acc = 1.00\n",
      "Epoch 90 / 300: Loss = 0.416 Acc = 1.00\n",
      "Epoch 91 / 300: Loss = 0.408 Acc = 1.00\n",
      "Epoch 92 / 300: Loss = 0.401 Acc = 1.00\n",
      "Epoch 93 / 300: Loss = 0.394 Acc = 1.00\n",
      "Epoch 94 / 300: Loss = 0.387 Acc = 1.00\n",
      "Epoch 95 / 300: Loss = 0.380 Acc = 1.00\n",
      "Epoch 96 / 300: Loss = 0.373 Acc = 1.00\n",
      "Epoch 97 / 300: Loss = 0.366 Acc = 1.00\n",
      "Epoch 98 / 300: Loss = 0.360 Acc = 1.00\n",
      "Epoch 99 / 300: Loss = 0.353 Acc = 1.00\n",
      "Epoch 100 / 300: Loss = 0.346 Acc = 1.00\n",
      "Epoch 101 / 300: Loss = 0.340 Acc = 1.00\n",
      "Epoch 102 / 300: Loss = 0.333 Acc = 1.00\n",
      "Epoch 103 / 300: Loss = 0.327 Acc = 1.00\n",
      "Epoch 104 / 300: Loss = 0.321 Acc = 1.00\n",
      "Epoch 105 / 300: Loss = 0.314 Acc = 1.00\n",
      "Epoch 106 / 300: Loss = 0.308 Acc = 1.00\n",
      "Epoch 107 / 300: Loss = 0.302 Acc = 1.00\n",
      "Epoch 108 / 300: Loss = 0.296 Acc = 1.00\n",
      "Epoch 109 / 300: Loss = 0.290 Acc = 1.00\n",
      "Epoch 110 / 300: Loss = 0.285 Acc = 1.00\n",
      "Epoch 111 / 300: Loss = 0.279 Acc = 1.00\n",
      "Epoch 112 / 300: Loss = 0.273 Acc = 1.00\n",
      "Epoch 113 / 300: Loss = 0.268 Acc = 1.00\n",
      "Epoch 114 / 300: Loss = 0.262 Acc = 1.00\n",
      "Epoch 115 / 300: Loss = 0.257 Acc = 1.00\n",
      "Epoch 116 / 300: Loss = 0.252 Acc = 1.00\n",
      "Epoch 117 / 300: Loss = 0.247 Acc = 1.00\n",
      "Epoch 118 / 300: Loss = 0.242 Acc = 1.00\n",
      "Epoch 119 / 300: Loss = 0.237 Acc = 1.00\n",
      "Epoch 120 / 300: Loss = 0.232 Acc = 1.00\n",
      "Epoch 121 / 300: Loss = 0.227 Acc = 1.00\n",
      "Epoch 122 / 300: Loss = 0.223 Acc = 1.00\n",
      "Epoch 123 / 300: Loss = 0.218 Acc = 1.00\n",
      "Epoch 124 / 300: Loss = 0.214 Acc = 1.00\n",
      "Epoch 125 / 300: Loss = 0.209 Acc = 1.00\n",
      "Epoch 126 / 300: Loss = 0.205 Acc = 1.00\n",
      "Epoch 127 / 300: Loss = 0.201 Acc = 1.00\n",
      "Epoch 128 / 300: Loss = 0.197 Acc = 1.00\n",
      "Epoch 129 / 300: Loss = 0.193 Acc = 1.00\n",
      "Epoch 130 / 300: Loss = 0.189 Acc = 1.00\n",
      "Epoch 131 / 300: Loss = 0.185 Acc = 1.00\n",
      "Epoch 132 / 300: Loss = 0.182 Acc = 1.00\n",
      "Epoch 133 / 300: Loss = 0.178 Acc = 1.00\n",
      "Epoch 134 / 300: Loss = 0.174 Acc = 1.00\n",
      "Epoch 135 / 300: Loss = 0.171 Acc = 1.00\n",
      "Epoch 136 / 300: Loss = 0.168 Acc = 1.00\n",
      "Epoch 137 / 300: Loss = 0.164 Acc = 1.00\n",
      "Epoch 138 / 300: Loss = 0.161 Acc = 1.00\n",
      "Epoch 139 / 300: Loss = 0.158 Acc = 1.00\n",
      "Epoch 140 / 300: Loss = 0.155 Acc = 1.00\n",
      "Epoch 141 / 300: Loss = 0.152 Acc = 1.00\n",
      "Epoch 142 / 300: Loss = 0.149 Acc = 1.00\n",
      "Epoch 143 / 300: Loss = 0.146 Acc = 1.00\n",
      "Epoch 144 / 300: Loss = 0.143 Acc = 1.00\n",
      "Epoch 145 / 300: Loss = 0.141 Acc = 1.00\n",
      "Epoch 146 / 300: Loss = 0.138 Acc = 1.00\n",
      "Epoch 147 / 300: Loss = 0.135 Acc = 1.00\n",
      "Epoch 148 / 300: Loss = 0.133 Acc = 1.00\n",
      "Epoch 149 / 300: Loss = 0.130 Acc = 1.00\n",
      "Epoch 150 / 300: Loss = 0.128 Acc = 1.00\n",
      "Epoch 151 / 300: Loss = 0.126 Acc = 1.00\n",
      "Epoch 152 / 300: Loss = 0.123 Acc = 1.00\n",
      "Epoch 153 / 300: Loss = 0.121 Acc = 1.00\n",
      "Epoch 154 / 300: Loss = 0.119 Acc = 1.00\n",
      "Epoch 155 / 300: Loss = 0.117 Acc = 1.00\n",
      "Epoch 156 / 300: Loss = 0.115 Acc = 1.00\n",
      "Epoch 157 / 300: Loss = 0.113 Acc = 1.00\n",
      "Epoch 158 / 300: Loss = 0.111 Acc = 1.00\n",
      "Epoch 159 / 300: Loss = 0.109 Acc = 1.00\n",
      "Epoch 160 / 300: Loss = 0.107 Acc = 1.00\n",
      "Epoch 161 / 300: Loss = 0.105 Acc = 1.00\n",
      "Epoch 162 / 300: Loss = 0.104 Acc = 1.00\n",
      "Epoch 163 / 300: Loss = 0.102 Acc = 1.00\n",
      "Epoch 164 / 300: Loss = 0.100 Acc = 1.00\n",
      "Epoch 165 / 300: Loss = 0.099 Acc = 1.00\n",
      "Epoch 166 / 300: Loss = 0.097 Acc = 1.00\n",
      "Epoch 167 / 300: Loss = 0.096 Acc = 1.00\n",
      "Epoch 168 / 300: Loss = 0.094 Acc = 1.00\n",
      "Epoch 169 / 300: Loss = 0.093 Acc = 1.00\n",
      "Epoch 170 / 300: Loss = 0.091 Acc = 1.00\n",
      "Epoch 171 / 300: Loss = 0.090 Acc = 1.00\n",
      "Epoch 172 / 300: Loss = 0.088 Acc = 1.00\n",
      "Epoch 173 / 300: Loss = 0.087 Acc = 1.00\n",
      "Epoch 174 / 300: Loss = 0.086 Acc = 1.00\n",
      "Epoch 175 / 300: Loss = 0.084 Acc = 1.00\n",
      "Epoch 176 / 300: Loss = 0.083 Acc = 1.00\n",
      "Epoch 177 / 300: Loss = 0.082 Acc = 1.00\n",
      "Epoch 178 / 300: Loss = 0.081 Acc = 1.00\n",
      "Epoch 179 / 300: Loss = 0.079 Acc = 1.00\n",
      "Epoch 180 / 300: Loss = 0.078 Acc = 1.00\n",
      "Epoch 181 / 300: Loss = 0.077 Acc = 1.00\n",
      "Epoch 182 / 300: Loss = 0.076 Acc = 1.00\n",
      "Epoch 183 / 300: Loss = 0.075 Acc = 1.00\n",
      "Epoch 184 / 300: Loss = 0.074 Acc = 1.00\n",
      "Epoch 185 / 300: Loss = 0.073 Acc = 1.00\n",
      "Epoch 186 / 300: Loss = 0.072 Acc = 1.00\n",
      "Epoch 187 / 300: Loss = 0.071 Acc = 1.00\n",
      "Epoch 188 / 300: Loss = 0.070 Acc = 1.00\n",
      "Epoch 189 / 300: Loss = 0.069 Acc = 1.00\n",
      "Epoch 190 / 300: Loss = 0.068 Acc = 1.00\n",
      "Epoch 191 / 300: Loss = 0.067 Acc = 1.00\n",
      "Epoch 192 / 300: Loss = 0.066 Acc = 1.00\n",
      "Epoch 193 / 300: Loss = 0.066 Acc = 1.00\n",
      "Epoch 194 / 300: Loss = 0.065 Acc = 1.00\n",
      "Epoch 195 / 300: Loss = 0.064 Acc = 1.00\n",
      "Epoch 196 / 300: Loss = 0.063 Acc = 1.00\n",
      "Epoch 197 / 300: Loss = 0.062 Acc = 1.00\n",
      "Epoch 198 / 300: Loss = 0.062 Acc = 1.00\n",
      "Epoch 199 / 300: Loss = 0.061 Acc = 1.00\n",
      "Epoch 200 / 300: Loss = 0.060 Acc = 1.00\n",
      "Epoch 201 / 300: Loss = 0.059 Acc = 1.00\n",
      "Epoch 202 / 300: Loss = 0.059 Acc = 1.00\n",
      "Epoch 203 / 300: Loss = 0.058 Acc = 1.00\n",
      "Epoch 204 / 300: Loss = 0.057 Acc = 1.00\n",
      "Epoch 205 / 300: Loss = 0.057 Acc = 1.00\n",
      "Epoch 206 / 300: Loss = 0.056 Acc = 1.00\n",
      "Epoch 207 / 300: Loss = 0.055 Acc = 1.00\n",
      "Epoch 208 / 300: Loss = 0.055 Acc = 1.00\n",
      "Epoch 209 / 300: Loss = 0.054 Acc = 1.00\n",
      "Epoch 210 / 300: Loss = 0.053 Acc = 1.00\n",
      "Epoch 211 / 300: Loss = 0.053 Acc = 1.00\n",
      "Epoch 212 / 300: Loss = 0.052 Acc = 1.00\n",
      "Epoch 213 / 300: Loss = 0.052 Acc = 1.00\n",
      "Epoch 214 / 300: Loss = 0.051 Acc = 1.00\n",
      "Epoch 215 / 300: Loss = 0.051 Acc = 1.00\n",
      "Epoch 216 / 300: Loss = 0.050 Acc = 1.00\n",
      "Epoch 217 / 300: Loss = 0.049 Acc = 1.00\n",
      "Epoch 218 / 300: Loss = 0.049 Acc = 1.00\n",
      "Epoch 219 / 300: Loss = 0.048 Acc = 1.00\n",
      "Epoch 220 / 300: Loss = 0.048 Acc = 1.00\n",
      "Epoch 221 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 222 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 223 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 224 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 225 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 226 / 300: Loss = 0.045 Acc = 1.00\n",
      "Epoch 227 / 300: Loss = 0.045 Acc = 1.00\n",
      "Epoch 228 / 300: Loss = 0.044 Acc = 1.00\n",
      "Epoch 229 / 300: Loss = 0.044 Acc = 1.00\n",
      "Epoch 230 / 300: Loss = 0.043 Acc = 1.00\n",
      "Epoch 231 / 300: Loss = 0.043 Acc = 1.00\n",
      "Epoch 232 / 300: Loss = 0.043 Acc = 1.00\n",
      "Epoch 233 / 300: Loss = 0.042 Acc = 1.00\n",
      "Epoch 234 / 300: Loss = 0.042 Acc = 1.00\n",
      "Epoch 235 / 300: Loss = 0.041 Acc = 1.00\n",
      "Epoch 236 / 300: Loss = 0.041 Acc = 1.00\n",
      "Epoch 237 / 300: Loss = 0.041 Acc = 1.00\n",
      "Epoch 238 / 300: Loss = 0.040 Acc = 1.00\n",
      "Epoch 239 / 300: Loss = 0.040 Acc = 1.00\n",
      "Epoch 240 / 300: Loss = 0.039 Acc = 1.00\n",
      "Epoch 241 / 300: Loss = 0.039 Acc = 1.00\n",
      "Epoch 242 / 300: Loss = 0.039 Acc = 1.00\n",
      "Epoch 243 / 300: Loss = 0.038 Acc = 1.00\n",
      "Epoch 244 / 300: Loss = 0.038 Acc = 1.00\n",
      "Epoch 245 / 300: Loss = 0.038 Acc = 1.00\n",
      "Epoch 246 / 300: Loss = 0.037 Acc = 1.00\n",
      "Epoch 247 / 300: Loss = 0.037 Acc = 1.00\n",
      "Epoch 248 / 300: Loss = 0.037 Acc = 1.00\n",
      "Epoch 249 / 300: Loss = 0.036 Acc = 1.00\n",
      "Epoch 250 / 300: Loss = 0.036 Acc = 1.00\n",
      "Epoch 251 / 300: Loss = 0.036 Acc = 1.00\n",
      "Epoch 252 / 300: Loss = 0.036 Acc = 1.00\n",
      "Epoch 253 / 300: Loss = 0.035 Acc = 1.00\n",
      "Epoch 254 / 300: Loss = 0.035 Acc = 1.00\n",
      "Epoch 255 / 300: Loss = 0.035 Acc = 1.00\n",
      "Epoch 256 / 300: Loss = 0.034 Acc = 1.00\n",
      "Epoch 257 / 300: Loss = 0.034 Acc = 1.00\n",
      "Epoch 258 / 300: Loss = 0.034 Acc = 1.00\n",
      "Epoch 259 / 300: Loss = 0.034 Acc = 1.00\n",
      "Epoch 260 / 300: Loss = 0.033 Acc = 1.00\n",
      "Epoch 261 / 300: Loss = 0.033 Acc = 1.00\n",
      "Epoch 262 / 300: Loss = 0.033 Acc = 1.00\n",
      "Epoch 263 / 300: Loss = 0.033 Acc = 1.00\n",
      "Epoch 264 / 300: Loss = 0.032 Acc = 1.00\n",
      "Epoch 265 / 300: Loss = 0.032 Acc = 1.00\n",
      "Epoch 266 / 300: Loss = 0.032 Acc = 1.00\n",
      "Epoch 267 / 300: Loss = 0.032 Acc = 1.00\n",
      "Epoch 268 / 300: Loss = 0.031 Acc = 1.00\n",
      "Epoch 269 / 300: Loss = 0.031 Acc = 1.00\n",
      "Epoch 270 / 300: Loss = 0.031 Acc = 1.00\n",
      "Epoch 271 / 300: Loss = 0.031 Acc = 1.00\n",
      "Epoch 272 / 300: Loss = 0.030 Acc = 1.00\n",
      "Epoch 273 / 300: Loss = 0.030 Acc = 1.00\n",
      "Epoch 274 / 300: Loss = 0.030 Acc = 1.00\n",
      "Epoch 275 / 300: Loss = 0.030 Acc = 1.00\n",
      "Epoch 276 / 300: Loss = 0.030 Acc = 1.00\n",
      "Epoch 277 / 300: Loss = 0.029 Acc = 1.00\n",
      "Epoch 278 / 300: Loss = 0.029 Acc = 1.00\n",
      "Epoch 279 / 300: Loss = 0.029 Acc = 1.00\n",
      "Epoch 280 / 300: Loss = 0.029 Acc = 1.00\n",
      "Epoch 281 / 300: Loss = 0.028 Acc = 1.00\n",
      "Epoch 282 / 300: Loss = 0.028 Acc = 1.00\n",
      "Epoch 283 / 300: Loss = 0.028 Acc = 1.00\n",
      "Epoch 284 / 300: Loss = 0.028 Acc = 1.00\n",
      "Epoch 285 / 300: Loss = 0.028 Acc = 1.00\n",
      "Epoch 286 / 300: Loss = 0.028 Acc = 1.00\n",
      "Epoch 287 / 300: Loss = 0.027 Acc = 1.00\n",
      "Epoch 288 / 300: Loss = 0.027 Acc = 1.00\n",
      "Epoch 289 / 300: Loss = 0.027 Acc = 1.00\n",
      "Epoch 290 / 300: Loss = 0.027 Acc = 1.00\n",
      "Epoch 291 / 300: Loss = 0.027 Acc = 1.00\n",
      "Epoch 292 / 300: Loss = 0.026 Acc = 1.00\n",
      "Epoch 293 / 300: Loss = 0.026 Acc = 1.00\n",
      "Epoch 294 / 300: Loss = 0.026 Acc = 1.00\n",
      "Epoch 295 / 300: Loss = 0.026 Acc = 1.00\n",
      "Epoch 296 / 300: Loss = 0.026 Acc = 1.00\n",
      "Epoch 297 / 300: Loss = 0.026 Acc = 1.00\n",
      "Epoch 298 / 300: Loss = 0.025 Acc = 1.00\n",
      "Epoch 299 / 300: Loss = 0.025 Acc = 1.00\n",
      "Epoch 300 / 300: Loss = 0.025 Acc = 1.00\n"
     ]
    }
   ],
   "source": [
    "history_classical = train(model_classical, n_epochs, training_data, word_to_ix, tag_to_ix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "def print_result(model, training_data, word_to_ix, ix_to_tag):\n",
    "    with torch.no_grad():\n",
    "        input_sentence = training_data[0][0]\n",
    "        labels = training_data[0][1]\n",
    "        inputs = prepare_sequence(input_sentence, word_to_ix)\n",
    "        tag_scores = model(inputs)\n",
    "\n",
    "        tag_ids = torch.argmax(tag_scores, dim=1).numpy()\n",
    "        tag_labels = [ix_to_tag[k] for k in tag_ids]\n",
    "        print(f\"Sentence:  {input_sentence}\")\n",
    "        print(f\"Labels:    {labels}\")\n",
    "        print(f\"Predicted: {tag_labels}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sentence:  ['The', 'dog', 'ate', 'the', 'apple']\n",
      "Labels:    ['DET', 'NN', 'V', 'DET', 'NN']\n",
      "Predicted: ['DET', 'NN', 'V', 'DET', 'NN']\n"
     ]
    }
   ],
   "source": [
    "print_result(model_classical, training_data, word_to_ix, ix_to_tag)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Tagger will use Quantum LSTM\n"
     ]
    }
   ],
   "source": [
    "n_qubits = 4\n",
    "\n",
    "model_quantum = LSTMTagger(embedding_dim, \n",
    "                        hidden_dim, \n",
    "                        vocab_size=len(word_to_ix), \n",
    "                        tagset_size=len(tag_to_ix), \n",
    "                        n_qubits=n_qubits)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1 / 300: Loss = 0.431 Acc = 0.78\n",
      "Epoch 2 / 300: Loss = 0.430 Acc = 0.78\n",
      "Epoch 3 / 300: Loss = 0.428 Acc = 0.78\n",
      "Epoch 4 / 300: Loss = 0.427 Acc = 0.78\n",
      "Epoch 5 / 300: Loss = 0.425 Acc = 0.78\n",
      "Epoch 6 / 300: Loss = 0.423 Acc = 0.78\n",
      "Epoch 7 / 300: Loss = 0.421 Acc = 0.78\n",
      "Epoch 8 / 300: Loss = 0.420 Acc = 0.78\n",
      "Epoch 9 / 300: Loss = 0.418 Acc = 0.78\n",
      "Epoch 10 / 300: Loss = 0.416 Acc = 0.78\n",
      "Epoch 11 / 300: Loss = 0.414 Acc = 0.78\n",
      "Epoch 12 / 300: Loss = 0.412 Acc = 0.78\n",
      "Epoch 13 / 300: Loss = 0.410 Acc = 0.78\n",
      "Epoch 14 / 300: Loss = 0.408 Acc = 0.78\n",
      "Epoch 15 / 300: Loss = 0.406 Acc = 0.78\n",
      "Epoch 16 / 300: Loss = 0.404 Acc = 0.78\n",
      "Epoch 17 / 300: Loss = 0.401 Acc = 0.78\n",
      "Epoch 18 / 300: Loss = 0.399 Acc = 0.78\n",
      "Epoch 19 / 300: Loss = 0.397 Acc = 0.78\n",
      "Epoch 20 / 300: Loss = 0.394 Acc = 0.78\n",
      "Epoch 21 / 300: Loss = 0.392 Acc = 0.78\n",
      "Epoch 22 / 300: Loss = 0.389 Acc = 0.78\n",
      "Epoch 23 / 300: Loss = 0.387 Acc = 0.78\n",
      "Epoch 24 / 300: Loss = 0.384 Acc = 0.78\n",
      "Epoch 25 / 300: Loss = 0.381 Acc = 0.78\n",
      "Epoch 26 / 300: Loss = 0.379 Acc = 0.78\n",
      "Epoch 27 / 300: Loss = 0.376 Acc = 0.78\n",
      "Epoch 28 / 300: Loss = 0.373 Acc = 0.78\n",
      "Epoch 29 / 300: Loss = 0.370 Acc = 0.78\n",
      "Epoch 30 / 300: Loss = 0.368 Acc = 0.78\n",
      "Epoch 31 / 300: Loss = 0.365 Acc = 0.78\n",
      "Epoch 32 / 300: Loss = 0.362 Acc = 0.78\n",
      "Epoch 33 / 300: Loss = 0.359 Acc = 0.78\n",
      "Epoch 34 / 300: Loss = 0.356 Acc = 0.78\n",
      "Epoch 35 / 300: Loss = 0.353 Acc = 0.78\n",
      "Epoch 36 / 300: Loss = 0.350 Acc = 0.78\n",
      "Epoch 37 / 300: Loss = 0.346 Acc = 0.78\n",
      "Epoch 38 / 300: Loss = 0.343 Acc = 0.78\n",
      "Epoch 39 / 300: Loss = 0.340 Acc = 0.78\n",
      "Epoch 40 / 300: Loss = 0.337 Acc = 0.78\n",
      "Epoch 41 / 300: Loss = 0.334 Acc = 0.78\n",
      "Epoch 42 / 300: Loss = 0.330 Acc = 0.78\n",
      "Epoch 43 / 300: Loss = 0.327 Acc = 0.78\n",
      "Epoch 44 / 300: Loss = 0.324 Acc = 0.78\n",
      "Epoch 45 / 300: Loss = 0.320 Acc = 0.78\n",
      "Epoch 46 / 300: Loss = 0.317 Acc = 0.78\n",
      "Epoch 47 / 300: Loss = 0.314 Acc = 0.89\n",
      "Epoch 48 / 300: Loss = 0.311 Acc = 0.89\n",
      "Epoch 49 / 300: Loss = 0.308 Acc = 0.89\n",
      "Epoch 50 / 300: Loss = 0.308 Acc = 0.89\n",
      "Epoch 51 / 300: Loss = 0.316 Acc = 0.89\n",
      "Epoch 52 / 300: Loss = 0.314 Acc = 0.89\n",
      "Epoch 53 / 300: Loss = 0.342 Acc = 0.89\n",
      "Epoch 54 / 300: Loss = 0.299 Acc = 0.89\n",
      "Epoch 55 / 300: Loss = 0.295 Acc = 1.00\n",
      "Epoch 56 / 300: Loss = 0.313 Acc = 0.78\n",
      "Epoch 57 / 300: Loss = 0.288 Acc = 1.00\n",
      "Epoch 58 / 300: Loss = 0.297 Acc = 0.89\n",
      "Epoch 59 / 300: Loss = 0.279 Acc = 1.00\n",
      "Epoch 60 / 300: Loss = 0.287 Acc = 0.89\n",
      "Epoch 61 / 300: Loss = 0.277 Acc = 1.00\n",
      "Epoch 62 / 300: Loss = 0.293 Acc = 0.89\n",
      "Epoch 63 / 300: Loss = 0.269 Acc = 1.00\n",
      "Epoch 64 / 300: Loss = 0.281 Acc = 0.89\n",
      "Epoch 65 / 300: Loss = 0.263 Acc = 1.00\n",
      "Epoch 66 / 300: Loss = 0.271 Acc = 0.89\n",
      "Epoch 67 / 300: Loss = 0.254 Acc = 1.00\n",
      "Epoch 68 / 300: Loss = 0.257 Acc = 1.00\n",
      "Epoch 69 / 300: Loss = 0.251 Acc = 1.00\n",
      "Epoch 70 / 300: Loss = 0.262 Acc = 0.89\n",
      "Epoch 71 / 300: Loss = 0.244 Acc = 1.00\n",
      "Epoch 72 / 300: Loss = 0.252 Acc = 1.00\n",
      "Epoch 73 / 300: Loss = 0.238 Acc = 1.00\n",
      "Epoch 74 / 300: Loss = 0.246 Acc = 1.00\n",
      "Epoch 75 / 300: Loss = 0.231 Acc = 1.00\n",
      "Epoch 76 / 300: Loss = 0.237 Acc = 1.00\n",
      "Epoch 77 / 300: Loss = 0.226 Acc = 1.00\n",
      "Epoch 78 / 300: Loss = 0.231 Acc = 1.00\n",
      "Epoch 79 / 300: Loss = 0.220 Acc = 1.00\n",
      "Epoch 80 / 300: Loss = 0.223 Acc = 1.00\n",
      "Epoch 81 / 300: Loss = 0.214 Acc = 1.00\n",
      "Epoch 82 / 300: Loss = 0.217 Acc = 1.00\n",
      "Epoch 83 / 300: Loss = 0.208 Acc = 1.00\n",
      "Epoch 84 / 300: Loss = 0.210 Acc = 1.00\n",
      "Epoch 85 / 300: Loss = 0.203 Acc = 1.00\n",
      "Epoch 86 / 300: Loss = 0.204 Acc = 1.00\n",
      "Epoch 87 / 300: Loss = 0.197 Acc = 1.00\n",
      "Epoch 88 / 300: Loss = 0.198 Acc = 1.00\n",
      "Epoch 89 / 300: Loss = 0.192 Acc = 1.00\n",
      "Epoch 90 / 300: Loss = 0.192 Acc = 1.00\n",
      "Epoch 91 / 300: Loss = 0.187 Acc = 1.00\n",
      "Epoch 92 / 300: Loss = 0.186 Acc = 1.00\n",
      "Epoch 93 / 300: Loss = 0.182 Acc = 1.00\n",
      "Epoch 94 / 300: Loss = 0.180 Acc = 1.00\n",
      "Epoch 95 / 300: Loss = 0.177 Acc = 1.00\n",
      "Epoch 96 / 300: Loss = 0.175 Acc = 1.00\n",
      "Epoch 97 / 300: Loss = 0.172 Acc = 1.00\n",
      "Epoch 98 / 300: Loss = 0.171 Acc = 1.00\n",
      "Epoch 99 / 300: Loss = 0.168 Acc = 1.00\n",
      "Epoch 100 / 300: Loss = 0.167 Acc = 1.00\n",
      "Epoch 101 / 300: Loss = 0.165 Acc = 1.00\n",
      "Epoch 102 / 300: Loss = 0.163 Acc = 1.00\n",
      "Epoch 103 / 300: Loss = 0.163 Acc = 1.00\n",
      "Epoch 104 / 300: Loss = 0.160 Acc = 1.00\n",
      "Epoch 105 / 300: Loss = 0.159 Acc = 1.00\n",
      "Epoch 106 / 300: Loss = 0.156 Acc = 1.00\n",
      "Epoch 107 / 300: Loss = 0.155 Acc = 1.00\n",
      "Epoch 108 / 300: Loss = 0.153 Acc = 1.00\n",
      "Epoch 109 / 300: Loss = 0.151 Acc = 1.00\n",
      "Epoch 110 / 300: Loss = 0.149 Acc = 1.00\n",
      "Epoch 111 / 300: Loss = 0.147 Acc = 1.00\n",
      "Epoch 112 / 300: Loss = 0.145 Acc = 1.00\n",
      "Epoch 113 / 300: Loss = 0.144 Acc = 1.00\n",
      "Epoch 114 / 300: Loss = 0.142 Acc = 1.00\n",
      "Epoch 115 / 300: Loss = 0.141 Acc = 1.00\n",
      "Epoch 116 / 300: Loss = 0.139 Acc = 1.00\n",
      "Epoch 117 / 300: Loss = 0.138 Acc = 1.00\n",
      "Epoch 118 / 300: Loss = 0.136 Acc = 1.00\n",
      "Epoch 119 / 300: Loss = 0.135 Acc = 1.00\n",
      "Epoch 120 / 300: Loss = 0.134 Acc = 1.00\n",
      "Epoch 121 / 300: Loss = 0.132 Acc = 1.00\n",
      "Epoch 122 / 300: Loss = 0.131 Acc = 1.00\n",
      "Epoch 123 / 300: Loss = 0.130 Acc = 1.00\n",
      "Epoch 124 / 300: Loss = 0.129 Acc = 1.00\n",
      "Epoch 125 / 300: Loss = 0.127 Acc = 1.00\n",
      "Epoch 126 / 300: Loss = 0.126 Acc = 1.00\n",
      "Epoch 127 / 300: Loss = 0.125 Acc = 1.00\n",
      "Epoch 128 / 300: Loss = 0.124 Acc = 1.00\n",
      "Epoch 129 / 300: Loss = 0.123 Acc = 1.00\n",
      "Epoch 130 / 300: Loss = 0.122 Acc = 1.00\n",
      "Epoch 131 / 300: Loss = 0.121 Acc = 1.00\n",
      "Epoch 132 / 300: Loss = 0.119 Acc = 1.00\n",
      "Epoch 133 / 300: Loss = 0.118 Acc = 1.00\n",
      "Epoch 134 / 300: Loss = 0.117 Acc = 1.00\n",
      "Epoch 135 / 300: Loss = 0.116 Acc = 1.00\n",
      "Epoch 136 / 300: Loss = 0.115 Acc = 1.00\n",
      "Epoch 137 / 300: Loss = 0.114 Acc = 1.00\n",
      "Epoch 138 / 300: Loss = 0.113 Acc = 1.00\n",
      "Epoch 139 / 300: Loss = 0.112 Acc = 1.00\n",
      "Epoch 140 / 300: Loss = 0.111 Acc = 1.00\n",
      "Epoch 141 / 300: Loss = 0.111 Acc = 1.00\n",
      "Epoch 142 / 300: Loss = 0.110 Acc = 1.00\n",
      "Epoch 143 / 300: Loss = 0.109 Acc = 1.00\n",
      "Epoch 144 / 300: Loss = 0.108 Acc = 1.00\n",
      "Epoch 145 / 300: Loss = 0.107 Acc = 1.00\n",
      "Epoch 146 / 300: Loss = 0.106 Acc = 1.00\n",
      "Epoch 147 / 300: Loss = 0.105 Acc = 1.00\n",
      "Epoch 148 / 300: Loss = 0.104 Acc = 1.00\n",
      "Epoch 149 / 300: Loss = 0.104 Acc = 1.00\n",
      "Epoch 150 / 300: Loss = 0.103 Acc = 1.00\n",
      "Epoch 151 / 300: Loss = 0.102 Acc = 1.00\n",
      "Epoch 152 / 300: Loss = 0.101 Acc = 1.00\n",
      "Epoch 153 / 300: Loss = 0.100 Acc = 1.00\n",
      "Epoch 154 / 300: Loss = 0.100 Acc = 1.00\n",
      "Epoch 155 / 300: Loss = 0.099 Acc = 1.00\n",
      "Epoch 156 / 300: Loss = 0.098 Acc = 1.00\n",
      "Epoch 157 / 300: Loss = 0.097 Acc = 1.00\n",
      "Epoch 158 / 300: Loss = 0.097 Acc = 1.00\n",
      "Epoch 159 / 300: Loss = 0.096 Acc = 1.00\n",
      "Epoch 160 / 300: Loss = 0.095 Acc = 1.00\n",
      "Epoch 161 / 300: Loss = 0.095 Acc = 1.00\n",
      "Epoch 162 / 300: Loss = 0.094 Acc = 1.00\n",
      "Epoch 163 / 300: Loss = 0.093 Acc = 1.00\n",
      "Epoch 164 / 300: Loss = 0.092 Acc = 1.00\n",
      "Epoch 165 / 300: Loss = 0.092 Acc = 1.00\n",
      "Epoch 166 / 300: Loss = 0.091 Acc = 1.00\n",
      "Epoch 167 / 300: Loss = 0.091 Acc = 1.00\n",
      "Epoch 168 / 300: Loss = 0.090 Acc = 1.00\n",
      "Epoch 169 / 300: Loss = 0.089 Acc = 1.00\n",
      "Epoch 170 / 300: Loss = 0.089 Acc = 1.00\n",
      "Epoch 171 / 300: Loss = 0.088 Acc = 1.00\n",
      "Epoch 172 / 300: Loss = 0.087 Acc = 1.00\n",
      "Epoch 173 / 300: Loss = 0.087 Acc = 1.00\n",
      "Epoch 174 / 300: Loss = 0.086 Acc = 1.00\n",
      "Epoch 175 / 300: Loss = 0.086 Acc = 1.00\n",
      "Epoch 176 / 300: Loss = 0.085 Acc = 1.00\n",
      "Epoch 177 / 300: Loss = 0.085 Acc = 1.00\n",
      "Epoch 178 / 300: Loss = 0.084 Acc = 1.00\n",
      "Epoch 179 / 300: Loss = 0.083 Acc = 1.00\n",
      "Epoch 180 / 300: Loss = 0.083 Acc = 1.00\n",
      "Epoch 181 / 300: Loss = 0.082 Acc = 1.00\n",
      "Epoch 182 / 300: Loss = 0.082 Acc = 1.00\n",
      "Epoch 183 / 300: Loss = 0.081 Acc = 1.00\n",
      "Epoch 184 / 300: Loss = 0.081 Acc = 1.00\n",
      "Epoch 185 / 300: Loss = 0.080 Acc = 1.00\n",
      "Epoch 186 / 300: Loss = 0.080 Acc = 1.00\n",
      "Epoch 187 / 300: Loss = 0.079 Acc = 1.00\n",
      "Epoch 188 / 300: Loss = 0.079 Acc = 1.00\n",
      "Epoch 189 / 300: Loss = 0.078 Acc = 1.00\n",
      "Epoch 190 / 300: Loss = 0.078 Acc = 1.00\n",
      "Epoch 191 / 300: Loss = 0.077 Acc = 1.00\n",
      "Epoch 192 / 300: Loss = 0.077 Acc = 1.00\n",
      "Epoch 193 / 300: Loss = 0.076 Acc = 1.00\n",
      "Epoch 194 / 300: Loss = 0.076 Acc = 1.00\n",
      "Epoch 195 / 300: Loss = 0.075 Acc = 1.00\n",
      "Epoch 196 / 300: Loss = 0.075 Acc = 1.00\n",
      "Epoch 197 / 300: Loss = 0.074 Acc = 1.00\n",
      "Epoch 198 / 300: Loss = 0.074 Acc = 1.00\n",
      "Epoch 199 / 300: Loss = 0.074 Acc = 1.00\n",
      "Epoch 200 / 300: Loss = 0.073 Acc = 1.00\n",
      "Epoch 201 / 300: Loss = 0.073 Acc = 1.00\n",
      "Epoch 202 / 300: Loss = 0.072 Acc = 1.00\n",
      "Epoch 203 / 300: Loss = 0.072 Acc = 1.00\n",
      "Epoch 204 / 300: Loss = 0.071 Acc = 1.00\n",
      "Epoch 205 / 300: Loss = 0.071 Acc = 1.00\n",
      "Epoch 206 / 300: Loss = 0.071 Acc = 1.00\n",
      "Epoch 207 / 300: Loss = 0.070 Acc = 1.00\n",
      "Epoch 208 / 300: Loss = 0.070 Acc = 1.00\n",
      "Epoch 209 / 300: Loss = 0.069 Acc = 1.00\n",
      "Epoch 210 / 300: Loss = 0.069 Acc = 1.00\n",
      "Epoch 211 / 300: Loss = 0.069 Acc = 1.00\n",
      "Epoch 212 / 300: Loss = 0.068 Acc = 1.00\n",
      "Epoch 213 / 300: Loss = 0.068 Acc = 1.00\n",
      "Epoch 214 / 300: Loss = 0.068 Acc = 1.00\n",
      "Epoch 215 / 300: Loss = 0.067 Acc = 1.00\n",
      "Epoch 216 / 300: Loss = 0.067 Acc = 1.00\n",
      "Epoch 217 / 300: Loss = 0.066 Acc = 1.00\n",
      "Epoch 218 / 300: Loss = 0.066 Acc = 1.00\n",
      "Epoch 219 / 300: Loss = 0.066 Acc = 1.00\n",
      "Epoch 220 / 300: Loss = 0.065 Acc = 1.00\n",
      "Epoch 221 / 300: Loss = 0.065 Acc = 1.00\n",
      "Epoch 222 / 300: Loss = 0.065 Acc = 1.00\n",
      "Epoch 223 / 300: Loss = 0.064 Acc = 1.00\n",
      "Epoch 224 / 300: Loss = 0.064 Acc = 1.00\n",
      "Epoch 225 / 300: Loss = 0.064 Acc = 1.00\n",
      "Epoch 226 / 300: Loss = 0.063 Acc = 1.00\n",
      "Epoch 227 / 300: Loss = 0.063 Acc = 1.00\n",
      "Epoch 228 / 300: Loss = 0.063 Acc = 1.00\n",
      "Epoch 229 / 300: Loss = 0.062 Acc = 1.00\n",
      "Epoch 230 / 300: Loss = 0.062 Acc = 1.00\n",
      "Epoch 231 / 300: Loss = 0.062 Acc = 1.00\n",
      "Epoch 232 / 300: Loss = 0.061 Acc = 1.00\n",
      "Epoch 233 / 300: Loss = 0.061 Acc = 1.00\n",
      "Epoch 234 / 300: Loss = 0.061 Acc = 1.00\n",
      "Epoch 235 / 300: Loss = 0.060 Acc = 1.00\n",
      "Epoch 236 / 300: Loss = 0.060 Acc = 1.00\n",
      "Epoch 237 / 300: Loss = 0.060 Acc = 1.00\n",
      "Epoch 238 / 300: Loss = 0.060 Acc = 1.00\n",
      "Epoch 239 / 300: Loss = 0.059 Acc = 1.00\n",
      "Epoch 240 / 300: Loss = 0.059 Acc = 1.00\n",
      "Epoch 241 / 300: Loss = 0.059 Acc = 1.00\n",
      "Epoch 242 / 300: Loss = 0.058 Acc = 1.00\n",
      "Epoch 243 / 300: Loss = 0.058 Acc = 1.00\n",
      "Epoch 244 / 300: Loss = 0.058 Acc = 1.00\n",
      "Epoch 245 / 300: Loss = 0.058 Acc = 1.00\n",
      "Epoch 246 / 300: Loss = 0.057 Acc = 1.00\n",
      "Epoch 247 / 300: Loss = 0.057 Acc = 1.00\n",
      "Epoch 248 / 300: Loss = 0.057 Acc = 1.00\n",
      "Epoch 249 / 300: Loss = 0.056 Acc = 1.00\n",
      "Epoch 250 / 300: Loss = 0.056 Acc = 1.00\n",
      "Epoch 251 / 300: Loss = 0.056 Acc = 1.00\n",
      "Epoch 252 / 300: Loss = 0.056 Acc = 1.00\n",
      "Epoch 253 / 300: Loss = 0.055 Acc = 1.00\n",
      "Epoch 254 / 300: Loss = 0.055 Acc = 1.00\n",
      "Epoch 255 / 300: Loss = 0.055 Acc = 1.00\n",
      "Epoch 256 / 300: Loss = 0.055 Acc = 1.00\n",
      "Epoch 257 / 300: Loss = 0.054 Acc = 1.00\n",
      "Epoch 258 / 300: Loss = 0.054 Acc = 1.00\n",
      "Epoch 259 / 300: Loss = 0.054 Acc = 1.00\n",
      "Epoch 260 / 300: Loss = 0.054 Acc = 1.00\n",
      "Epoch 261 / 300: Loss = 0.053 Acc = 1.00\n",
      "Epoch 262 / 300: Loss = 0.053 Acc = 1.00\n",
      "Epoch 263 / 300: Loss = 0.053 Acc = 1.00\n",
      "Epoch 264 / 300: Loss = 0.053 Acc = 1.00\n",
      "Epoch 265 / 300: Loss = 0.052 Acc = 1.00\n",
      "Epoch 266 / 300: Loss = 0.052 Acc = 1.00\n",
      "Epoch 267 / 300: Loss = 0.052 Acc = 1.00\n",
      "Epoch 268 / 300: Loss = 0.052 Acc = 1.00\n",
      "Epoch 269 / 300: Loss = 0.051 Acc = 1.00\n",
      "Epoch 270 / 300: Loss = 0.051 Acc = 1.00\n",
      "Epoch 271 / 300: Loss = 0.051 Acc = 1.00\n",
      "Epoch 272 / 300: Loss = 0.051 Acc = 1.00\n",
      "Epoch 273 / 300: Loss = 0.051 Acc = 1.00\n",
      "Epoch 274 / 300: Loss = 0.050 Acc = 1.00\n",
      "Epoch 275 / 300: Loss = 0.050 Acc = 1.00\n",
      "Epoch 276 / 300: Loss = 0.050 Acc = 1.00\n",
      "Epoch 277 / 300: Loss = 0.050 Acc = 1.00\n",
      "Epoch 278 / 300: Loss = 0.050 Acc = 1.00\n",
      "Epoch 279 / 300: Loss = 0.049 Acc = 1.00\n",
      "Epoch 280 / 300: Loss = 0.049 Acc = 1.00\n",
      "Epoch 281 / 300: Loss = 0.049 Acc = 1.00\n",
      "Epoch 282 / 300: Loss = 0.049 Acc = 1.00\n",
      "Epoch 283 / 300: Loss = 0.048 Acc = 1.00\n",
      "Epoch 284 / 300: Loss = 0.048 Acc = 1.00\n",
      "Epoch 285 / 300: Loss = 0.048 Acc = 1.00\n",
      "Epoch 286 / 300: Loss = 0.048 Acc = 1.00\n",
      "Epoch 287 / 300: Loss = 0.048 Acc = 1.00\n",
      "Epoch 288 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 289 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 290 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 291 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 292 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 293 / 300: Loss = 0.047 Acc = 1.00\n",
      "Epoch 294 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 295 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 296 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 297 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 298 / 300: Loss = 0.046 Acc = 1.00\n",
      "Epoch 299 / 300: Loss = 0.045 Acc = 1.00\n",
      "Epoch 300 / 300: Loss = 0.045 Acc = 1.00\n"
     ]
    }
   ],
   "source": [
    "history_quantum = train(model_quantum, n_epochs, training_data, word_to_ix, tag_to_ix)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sentence:  ['The', 'dog', 'ate', 'the', 'apple']\n",
      "Labels:    ['DET', 'NN', 'V', 'DET', 'NN']\n",
      "Predicted: ['DET', 'NN', 'V', 'DET', 'NN']\n"
     ]
    }
   ],
   "source": [
    "print_result(model_quantum, training_data, word_to_ix, ix_to_tag)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Plot the training history"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "from matplotlib import pyplot as plt\n",
    "\n",
    "def plot_history(history_classical, history_quantum):\n",
    "    loss_c = history_classical['loss']\n",
    "    acc_c = history_classical['acc']\n",
    "    loss_q = history_quantum['loss']\n",
    "    acc_q = history_quantum['acc']\n",
    "    n_epochs = max([len(loss_c), len(loss_q)])\n",
    "    x_epochs = [i for i in range(n_epochs)]\n",
    "    \n",
    "    fig, ax1 = plt.subplots()\n",
    "    \n",
    "    ax1.set_xlabel(\"Epoch\")\n",
    "    ax1.set_ylabel(\"Loss\")\n",
    "    ax1.plot(loss_c, label=\"Classical LSTM loss\", color='orange', linestyle='dashed')\n",
    "    ax1.plot(loss_q, label=\"Quantum LSTM loss\", color='red', linestyle='solid')\n",
    "\n",
    "    ax2 = ax1.twinx()\n",
    "    ax2.set_ylabel(\"Accuracy\")\n",
    "    ax2.plot(acc_c, label=\"Classical LSTM accuracy\", color='steelblue', linestyle='dashed')\n",
    "    ax2.plot(acc_q, label=\"Quantum LSTM accuracy\", color='blue', linestyle='solid')\n",
    "\n",
    "    plt.title(\"Part-of-Speech Tagger Training__torch\")\n",
    "    plt.ylim(0., 1.1)\n",
    "    #plt.legend(loc=\"upper right\")\n",
    "    fig.legend(loc=\"upper right\", bbox_to_anchor=(1,0.8), bbox_transform=ax1.transAxes)\n",
    "\n",
    "    plt.savefig(\"pos_training_torch.pdf\")\n",
    "    plt.savefig(\"pos_training_torch.png\")\n",
    "    \n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "plot_history(history_classical, history_quantum)"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The loss function decreases as a function of the training epoch, and after 300 epochs both networks are able to tag correctly the first sentence. Due to the complexity of the simulation of the quantum circuit, it took approximatively 15 minutes to finish the training, to be compared to a mere 8 seconds for the classical case. "
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Refrences"
   ]
  },
  {
   "attachments": {},
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[1] Riccardo Di Sipio, Jia-Hong Huang, Samuel Yen-\n",
    "Chi Chen, Stefano Mangini, and Marcel Worring.\n",
    "The dawn of quantum natural language processing.\n",
    "In ICASSP 2022-2022 IEEE International Confer-\n",
    "ence on Acoustics, Speech and Signal Processing\n",
    "(ICASSP), pages 8612–8616. IEEE, 2022."
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
